import { defineConfig } from 'vite'
import { visualizer } from 'rollup-plugin-visualizer'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
// import monacoEditorPlugin from 'vite-plugin-monaco-editor'

import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import { VueAmapResolver } from '@vuemap/unplugin-resolver'

import viteCompression from 'vite-plugin-compression'

// 引入node的path模块
const path = require('path')
// 用于加载路径
const resolve = dir => path.join(__dirname, dir)

// 项目部署基础 (判断是打包/开发环境)
// 默认情况下，我们假设你的应用将被部署在域的根目录下,
// 例如：https://www.my-app.com/
// 默认：'/'
// 如果您的应用程序部署在子路径中，则需要在这指定子路径
// 例如：https://www.foobar.com/my-app/
// 需要将它改为'/my-app/'
const BASE_URL = process.env.NODE_ENV === 'production'
    ? '/editor-mock/'
    : './'

// https://vitejs.dev/config/
export default defineConfig({
    base: BASE_URL, // 项目基本路径
    resolve: {
        alias: { // 路径的别名
            '@': resolve('src'),
            '_c': resolve('src/components')
        }
    },
    build: {
        sourcemap: false, // 构建后是否生成 source map 文件(减少打包时的体积, 加快打包速度)
        minify: 'terser',
        terserOptions: {
            compress: {
                // 清除console和debugger
                drop_console: true,
                drop_debugger: true
            }
        }
    },
    server: {
        port: 8000, // 端口号
        open: true, // 是否自动在浏览器打开
        proxy: {
            // 为开发服务器配置自定义代理规则(反向代理，解决跨域问题)
            // https://cn.vitejs.dev/config/#server-open
            // '/': 'localhost:8000'
        },
        host: '0.0.0.0'
    },
    plugins: [
        vue(),
        vueJsx(),
        visualizer(),
        // monacoEditorPlugin({
        //     languageWorkers: ['editorWorkerService', 'json', 'typescript']
        // }),
        AutoImport({
            resolvers: [
                ElementPlusResolver({
                    exclude: /^ElAmap|ElBmap|ElBmapv[A-Z]*!/ // 避免地图组件与Element-Plus的resolver冲突
                }),
                VueAmapResolver()
            ]
        }),
        Components({
            directoryAsNamespace: true,
            resolvers: [
                ElementPlusResolver({
                    exclude: /^ElAmap|ElBmap|ElBmapv[A-Z]*!/ // 避免地图组件与Element-Plus的resolver冲突
                }),
                VueAmapResolver()
            ]
        }),
        // gzip静态资源压缩
        viteCompression({
            verbose: true,
            disable: false, // 不禁用压缩
            deleteOriginFile: true, // 压缩后是否删除原文件
            threshold: 10240, // 压缩前最小文件大小
            algorithm: 'gzip', // 压缩算法
            ext: '.gz' // 文件类型
        })
    ]
})